#include<iostream>
#include<string>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<memory>
#include<memory.h>
#include"thread.hpp"

using namespace std;
uint16_t serverport=0;
string serverip;


static void* udpSend(void* args)
{
    int sock=*(int*)((ThreadData*)args)->_args;
    string name=((ThreadData*)args)->_name;
    string buffer;
    struct sockaddr_in server;
    server.sin_family=AF_INET;
    server.sin_port=htons(serverport);
    server.sin_addr.s_addr=inet_addr(serverip);
    while(true)
    {
        cerr<<"请输入您的信息"<<endl;
        getline(cin,buffer);
        if(buffer=="quit")
            break;
        sendto(sock,buffer.c_str(),buffer.size(),0,(struct sockaddr*)&server,sizeof(server));
    }
    return nullptr;
}
static void* udpRecv(void* args)
{
    int sock=*(int*)((ThreadData*)args)->_args;
    string name=((ThreadData*)args)->_name;
    char buffer[1024];
    while(true)
    {
        memset(buffer,0,sizeof(buffer));
        struct sockaddr_in temp;
        ssize_t s=recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)temp,sizeof(temp));
        if(s > 0)
        {
            buffer[s]=0;
            cout<<buffer<<endl;
        }
    }
}
int main()
{
    int sock=socket(AF_INET,SOCK_DGRAM,0);
    if(sock < 0)
    {
        cerr<<"socket() failed"<<endl;
        exit(1);
    }
    unique_ptr<Thread> sender(new Thread(1,udpSend,(void*)&sock));
    unique_ptr<Thread> recver(new Thread(1,udpRecv,(void*)&sock));

    return 0;
}
// static void usage(string proc)
// {
//     cout<<proc<<"serverIp serverPort"<<endl;
// }
// static void* udpSend(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     string name=((ThreadData*)args)->_name;
//     string buffer;
//     struct sockaddr_in server;
//     server.sin_family=AF_INET;
//     server.sin_port=htons(serverport);
//     server.sin_addr.s_addr=inet_addr(clientip);
//     while(true)
//     {
//         cerr<<"请输入您的信息"<<endl;
//         getline(cin,buffer);
//         if(buffer=="quit"){
//             break;
//         }
//         sendto(sock,buffer.c_str(),buffer.size(),0,(struct sockaddr*)&server,sizeof(server));

//     }
//     return nullptr;
// }
// static void* udpRecv(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     string name=((ThreadData*)args)->_name;
//     char buffer[1024];
//     while(true)
//     {
//         memset(buffer,0,sizeof(buffer));
//         struct sockaddr_in client;
//         socklen_t len=sizeof(client);
//         socklen_t len=sizeof(client);
//         ssize_t s=recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)&client,len);
//         if(s > 0)
//         {
//             buffer[s]=0;
//             cout<<buffer<<endl;
//         }
//     }
// }

// static void* udpSend(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     string name=((ThreadData*)args)->_name;
//     struct sockaddr_in server;
//     bzero(server);
//     server.sin_family=AF_INET;
//     server.sin_port=htons(serverport);
//     server.sin_addr.s_addr=inet_addr(serverip);
//     string buffer;
//     while(true)
//     {
//         cerr<<"请输入您的信息"<<endl;
//         getline(cin,buffer);
//         if(buffer=="quit"){
//             break;
//         }
//         //将信息发送给服务器
//         sendto(sock,buffer.c_str(),sizeof(buffer),0,(struct sockaddr*)server,sizeof(server));
//     }
//     return nullptr;
// }
// static void* udpSend(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     string name=((ThreadData*)args)->_name;
//     struct sockaddr_in server;
//     server.sin_family=AF_INET;
//     server.sin_port=htons(serverport);
//     server.sin_addr.s_addr=inet_addr(serverip.c_str());
//     string message;

//     while(true)
//     {
//         cerr<<"请输入您的信息"<<endl;
//         getline(cin,message);
//         if(message=="quit")
//         break;
//         sendto(sock,message.c_str(),message.size(),0,(struct sockaddr*)&server,sizeof(server));
//     }
//     return nullptr;
// }

// static void* udpRecv(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     string name=((ThreadData*)args)->_name;
//     char buffer[1024];
//     while(true)
//     {
//         memset(buffer,0,sizeof(buffer));
//         struct sockaddr_in client;
//         socklen_t len=sizeof(client);
//         ssize_t s=recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)&client,len);
//         if(s > 0)
//         {
//             buffer[s]=0;
//             cout<<buffer<<endl;
//         }
//     }
// }
// static void* udpRecv(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     string name=((ThreadData*)args)->_name;
//     char buffer[1024];
//     while(true)
//     {
//         memset(buffer,0,sizeof(buffer));
//         struct sockaddr_in client;
//         socklen_t len=sizeof(client);
//         ssize_t s=recvfrom(sock,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&client,len);
//         if(s > 0)
//         {
//             buffer[s]=0;
//             cout<<buffer<<endl;
//         }
//     }
// }
// // static void* udpSend(void* args)
// // {
// //     int sock=*(int*)((ThreadData*)args)->args
// // }
// static void* udpRecv(void* args)
// {
//     int sock=*(int*)((ThreadData*)args)->_args;
//     string name=((ThreadData*)args)->_name;
//     char buffer[1024];
//     while(true)
//     {
//         memset(&client,0,sizeof(client));
//         struct sockaddr_in client;
//         socklen_t len=sizeof(client);
//         ssize_t s=recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)&client,len);
//         if(s > 0)
//         {
//             buffer[s]=0;
//             cout<<buffer<<endl;
//         }
//     }
// }

// int main(int argc,char* argv[])
// {
//     if(argc!=0)
//     {
//         usage(argv[0]);
//         exit(1);
//     }
//     int sock=socket(AF_INET,SOCK_DGRAM,0);
//     if(sock < 0)
//     {
//         cerr<<"socket error"<<endl;
//         exit(2);
//     }
//     serverport=atoi(argv[2]);
//     serverip=argv[1];

//     unique_ptr<Thread>sender(new Thread(1,udpSend,(void*)&sock));
//     unique_ptr<Thread>recver(new Thread(1,udpRecv,(void*)&sock));
    
//     sender->start();
//     recver->start();
//     return 0;
// }
// // static void* udpRecv(void* args)
// // {
// //     int sock=*(int*)((ThreadData*)args)->_args;
// //     string name=((ThreadData*)args)->_name;
// //     char buffer[1024];
// //     while(true)
// //     {
// //         memset(buffer,0,sizeof(buffer));
// //         struct sockaddr_in client;
// //         socklen_t len=sizeof(client);
// //         //把信息读到这个buffer里面来
// //         ssize_t s=recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)&client,len);
// //         if(s > 0)
// //         {
// //             buffer[s]=0;
// //             cout<<buffer<<endl;
// //         }
// //     }
// // }
// // static void* udpServer(void* args)
// // {
// //     int sock=*(int*)((ThreadData*)args)->_args;
// //     string name=((ThreadData*)args)->_name;

// //     string message;
// //     struct sockaddr_in server;
// //     memset(&server,0,sizeof(server));
// //     server.sin_family=AF_INET;
// //     server.sin_port=ntohs(serverport);
// //     server.sin_addr.s_addr=inet_addr(serverip.c_str());

// //     while(true)
// //     {
// //         cerr<<"请输入您的信息"<<endl;
// //         //通过从键盘读取的方式将信息发送给客户端
// //         getline(cin,message);
// //         if(message=="quit")
// //         {
// //             break;
// //         }
// //         sendto(sock,message.c_str(),message.size(),0,(struct sockaddr*)&server,sizeof(server));
// //     }
// //     return nullptr;
// // }